/**
 * 
 */
package LocalDB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 *	检测本地数据库是否存在、各表是否完全，进行初始化
 *	<p>
 *	在系统启动时进行检测，使用全静态
 *
 *	@create 2014.11.13
 *	@latest 2014.11.13
 *
 *	@author sundaydx
 *	@since 2.0.1
 *	@version 2.0.1
 */
public class InitDB {
	
	/**
	 *	本地数据库初始化变量
	 *		conn                  JDBC数据库连接
	 *		stm                   JDBC数据库statement
	 *		rs                    JDBC数据库查询结果
	 *		stringIsTableExist    检测数据库是否存在的语句模型
	 */
	private static Connection conn;
	private static Statement stm;
	private static ResultSet rs;
	private final static String stringIsTableExist = "SELECT COUNT(*) FROM "
			+ "sqlite_master where type = 'table' and name = ";
	
	private final static Logger logger = LogManager.getLogger(InitDB.class.getName());
	
	/**
	 *	检查并初始化本地数据库并初始化本地数据库连接
	 *
	 *	@throws ClassNotFoundException
	 *		数据库驱动缺失
	 *
	 *	@throws SQLException
	 *		数据库连接出错
	 *
	 *	@create 2014.11.13
	 *	@latest 2014.11.13
	 *
	 *	@author sundaydx
	 *	@since 2.0.1
	 *	@version 2.0.1
	 */
	public static void initDataBase() throws ClassNotFoundException, SQLException {
		
		Class.forName("org.sqlite.JDBC");
	    conn = DriverManager.getConnection("jdbc:sqlite:Config.db");
	    stm = conn.createStatement();
	    
	    logger.info("进行本地数据库初始化检查");
	    /** 检查本地数据库是否初始化 */
	    isAllTableCreated();
	    
	    /** 运行结束，关闭连接 */
	    if(conn != null) conn.close();
	    
	    /** 声明对象，调用static区块中的初始化 */
	    Class.forName("LocalDB.LocalDataBase");
	}
	
	/**
	 *	检测本地数据库中对应表是否存在
	 *
	 *	@param tableName 需要检测的对应表名
	 *
	 *	@return
	 *		boolean 表示是否存在
	 *
	 *	@throws SQLException
	 *		数据库连接过程中的连接错误
	 *
	 *	@create 2014.11.13
	 *	@latest 2014.11.13
	 *
	 *	@author sundaydx
	 *	@since 2.0.1
	 *	@version 2.0.1
	 */
	private static boolean isTableCreate(String tableName) throws SQLException {
		
		rs = stm.executeQuery(stringIsTableExist + "\"" + tableName + "\"");
		
		while(rs.next()) {
			if(rs.getString("COUNT(*)").equalsIgnoreCase("1")) {
				return true;
			} else {
				return false;
			}
		}
		return false;
	}
	
	/**
	 *	初始化数据库，创建Orders、Config表
	 *
	 *	@throws SQLException
	 *		连接数据库的错误
	 *
	 *	@create 2014.11.13
	 *	@latest 2014.11.13
	 *
	 *	@author sundaydx
	 *	@since 2.0.1
	 *	@version 2.0.1
	 */
	private static void createTable() {
		
		/** 创建 Config 表 */
		final String queryTableConfigCreate = "CREATE TABLE `Config` ("
				+ "`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ "`Mac`	TEXT NOT NULL UNIQUE);";
		
		try {
			stm.executeUpdate(queryTableConfigCreate);
			logger.info("完成创建 Config 表");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			logger.warn("创建本地数据表失败\n" + e.getMessage());
		}
	}
	
	/**
	 *	检测本地数据库所有数据表的情况
	 *	<p>
	 *	通过测试orders表的存在判断数据库的存在，没有orders表就执行初始化
	 *
	 *	@throws SQLException
	 *		数据库连接过程可能错误
	 *
	 *	@create 2014.11.13
	 *	@latest 2014.11.13
	 *
	 *	@author sundaydx
	 *	@since 2.0.1
	 *	@version 2.0.1
	 */
	private static void isAllTableCreated() throws SQLException {
		
		/** 本地数据库检测用数据表 */
		String stringTableName = "Config";
		
		if(!isTableCreate(stringTableName)) {
			
			logger.info("本地数据库为空，进行初始化");
			createTable();
		}
		
	}

}
